package com.tbit.uqbike.client.service;

import com.tbit.uqbike.client.pojo.*;
import com.tbit.uqbike.client.pojo.dto.RefundMoneyReturnDTO;
import com.tbit.uqbike.client.remote.tenxun.models.DetectAuthResponse;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 账户service
 *
 * @author Leon
 * 2017年2月24日 下午4:09:17
 */
public interface UserService {
    /**
     * 添加
     *
     * @param user
     */
    void insert(User user, Integer agentId);

    /**
     * 用户
     *
     * @param
     * @return
     */
    User getByAccountIdAndPhone(Integer accountId, String phone);

    /**
     * 根据用户id查询
     *
     * @param userId
     * @return
     */
    User getByUserId(Integer userId);

    /**
     * 更新
     *
     * @param user
     */
    void update(User user);

    /**
     * 更新押金支付状态
     *
     * @param
     */
    void updateDeposit(Integer userId, Integer deposit);

    /**
     * 更新押金支付状态和金额
     *
     * @param
     */
    void updateDepositAndMoney(Integer userId, Integer deposit, Double depositMoney);

    /**
     * 更新账户金额
     *
     * @param
     */
    void updateMoney(Integer userId, Double money);

    /**
     * 更新押金金额
     *
     * @param
     */
    void updateDepositMoney(Integer userId, Double money);

    /**
     * 实名认证
     *
     * @param idNO
     * @param name
     */
    void updateNameAuth(Integer userId, String idNO, String name);

    /**
     * 实名认证
     *
     * @param userId
     * @param idNO
     * @param name
     */
    void authName(Integer userId, Integer accountId, String idNO, String name, Integer operationAreaId);

    void editSex(Integer userId);

    /**
     * 更新免押会员到期日期
     *
     * @param userId
     * @param depositDate
     */
    void updateDepositDate(Integer userId, String depositDate);

    /**
     * 导入别的平台数据
     *
     * @param user
     */
    void insertOther(User user);

    /**
     * 设置openId
     *
     * @param code
     * @param user
     */
    void setOpenId(String code, User user, Integer accountId);


    /**
     * 用户人脸识别认证e政通
     *
     * @param user
     * @param userCode
     */
    String faceCheck(User user, String userCode);

    /**
     * 人脸识别阿里云
     *
     * @param user
     * @param base64Str
     */
    void faceCheckNew(User user, String base64Str, Machine machine);


    /**
     * 用户人脸识别认证腾讯
     *
     * @param user
     * @param userCode
     */
    DetectAuthResponse faceCheckTencent(User user, String userCode, String redirectUrl);

    /**
     * 用户人脸识别认证腾讯
     *
     * @param bizToken  token
     */
    Boolean getTencentResult(User user, String bizToken, Machine machine);


    /**
     * 用户人脸识别认证自研
     *
     * @param bizToken  token
     */
    Boolean getTencentResultLoacl(User user, String bizToken, Machine machine);

    /**
     * 快过期套餐检测
     *
     * @param user
     * @param map
     */
    void expireSoon(User user, Map<String, Object> map, Integer adAccountId);

    /**
     * 退款
     *
     * @param adAccountId
     */
    Double returnMoney(Integer adAccountId, double money, Integer userId, boolean isApi, Integer operatorId,
                       String operatorName, String operatorPhone);

    /**
     * 退款(新)
     *
     * @param adAccountId
     */
    RefundMoneyReturnDTO returnMoneyNew(Integer adAccountId, double money, Integer userId, boolean isApi, Integer operatorId,
                           String operatorName, String operatorPhone, String refundBatch);
    /**
     * 修改扣款金额
     *
     * @param user
     */
    void updateRideMoney(User user);

    /**
     * 退款 对网页平台接口
     *
     * @param userId     用户id
     * @param money      金额
     * @param buyOrderNO 订单号(骑行卡会员卡免押卡、优惠券套餐 传递订单号、骑行订单传递骑行订单号)
     * @param sign       签名
     * @param date       时间戳
     * @param param      附加参数
     * @return
     */
    double returnMoneyApi(Integer userId, Double money, Long fineMoney, String buyOrderNO, String sign, Long date,
                          String param, Integer adAccountId, Integer operatorId, String operatorName, String operatorPhone, Integer sendMsg, String remark);


    /**
     * 退款 对网页平台接口（新）
     *
     * @param userId     用户id
     * @param money      金额
     * @param buyOrderNO 订单号(骑行卡会员卡免押卡、优惠券套餐 传递订单号、骑行订单传递骑行订单号)
     * @param sign       签名
     * @param date       时间戳
     * @param param      附加参数
     * @return
     */
    RefundMoneyReturnDTO returnMoneyApiNew(Integer userId, Double money, Long fineMoney, String buyOrderNO, String sign, Long date,
                                           String param, Integer adAccountId, Integer operatorId, String operatorName, String operatorPhone, Integer sendMsg, String remark);


    Integer getPayPlatformTypeByRecharge(Recharge recharge);


    /**
     * 退款逻辑实现
     *
     * @param recharge    订单
     * @param refundNO    退款订单号
     * @param refundMoney 退款金额
     * @param user        用户信息
     * @return
     */
    Double getReturnResult(Account account, Recharge recharge, String refundNO, Double refundMoney, User user, String refundBusinessNO,
                           Integer operatorId, String operatorName, String operatorPhone, String rideOrderNo, String transactionLogRemark);

    /**
     * 退款逻辑实现（新）
     *
     * @param recharge    订单
     * @param refundNO    退款订单号
     * @param refundMoney 退款金额
     * @param user        用户信息
     * @return
     */
    Double getReturnResultNew(Account account, Recharge recharge, String refundNO, Double refundMoney, User user, String refundBusinessNO,
                               Integer operatorId, String operatorName, String operatorPhone, String rideOrderNo, String transactionLogRemark,
                              Integer sendMsg,boolean isApi, String refundBatch);


    /**
     * 获得可退款订单
     *
     * @param userId
     * @param recharges
     * @return
     */
    List<Recharge> getCanRefundOrder(Integer userId, List<Recharge> recharges);

    /**
     * 用户支付事件
     *
     * @param userId
     */
    void payEvent(Integer userId);

    /**
     * 获取用户骑行分
     *
     * @param userId
     * @return
     */
    Integer getUserRidingScore(Integer userId);

    /**
     * 修改用户骑行分
     *
     * @param userId
     * @param ridingScore
     */
    void updateUserRidingScore(Integer userId, Integer ridingScore);

    /**
     * 根据用户身份证获取用户id
     *
     * @param idNO
     * @param accountId
     * @return
     */
    List<Integer> getUserIdByIdNo(String idNO, Integer accountId);

    /**
     * 设置openId
     *
     * @param code
     * @param accountId
     */
    List<User> checkLogin(String code, Integer accountId);

    /**
     * 优驱腾讯云人脸识别
     * @param user user
     * @param userCode 车辆编号
     * @param redirectUrl 回调地址
     * @return String
     */
    DetectAuthResponse youquFaceCheckTencent(User user, String userCode, String redirectUrl, Integer accountId);

    /**
     * 获取优驱腾讯云人脸识别结果
     * @param user user
     * @param bizToken bizToken
     * @param machine 设备信息
     * @param accountId 区域id
     * @return boolean
     */
    boolean getuqResult(User user, String bizToken, Machine machine, Integer accountId);

    /**
     * 对用户退款操作进行加锁
     * @param userId 用户id
     */
    void lockUserRefund(Integer userId);

    /**
     * 释放锁
     * @param userId
     */
    void unlockUserRefund(Integer userId);

    //调用yqapi人脸自研方案
    DetectAuthResponse youquFaceCheckLocal(User user, String userCode,Integer accountId);

    /**
     * 实名认证 + 人脸识别
     * @param accountId 区域id
     * @param redirectUrl 回调地址
     * @param userName 用户名称
     * @param idNO 身份证号
     * @return result
     */
    DetectAuthResponse nameAuthGetBizToken(User user, Integer accountId, String redirectUrl, String userName, String idNO);

    /**
     * 获取实名认证结果
     * @param user 用户信息
     * @param bizToken bizToken
     * @param accountId accountId
     * @return result
     */
    Boolean nameAuthGetResult(User user, String bizToken, Integer accountId);

    /**
     * 获取用户骑行位置
     * @param userCode 车辆编号
     * @return result
     */
    Integer ridingPositionDisplay(String userCode);
    /**
     * 根据身份证号检查是否有欠费 (true=欠费，false=无欠费)
     * @param accountId 品牌id
     * @param idNO 身份证号码
     */
    boolean checkArrearsByIdNO(Integer accountId, String idNO);

    /**
     * 获取用户注销次数
     * @param accountId
     * @param phone
     * @return
     */
    Integer getCountByAccountIdAndPhone(Integer accountId, String phone);

    /**
     * 更新非空字段
     * @param user
     */
    void updateAll(User user);

    /**
     * 获取用户今年内注销次数
     * @param accountId
     * @param phone
     * @return
     */
    Integer getCountByAccountIdAndPhoneNearlyYear(Integer accountId, String phone);

    /**
     * @param brandIds 品牌id集合
     * @param phone    手机号
     * @return
     */
    User getByShareBrandAndHasNameAuth(List<Integer> brandIds, String phone);

    /**
     * 获取当前品牌与其他品牌有配置共享的所有品牌id
     *
     * @param brandId 当前品牌id
     * @return
     */
    List<Integer> getBrandIdsByShareConfig(Integer brandId);

    /**
     * 更新用户金额为一个值
     * @param userId 用户id
     * @param money 金额（单位：分）
     * @param time 时间
     */
    void updateUserMoney(Integer userId, Long money, Date time);
}